package com.zyf.concurrency.chapter15;

/**
 * 基于CAS实现的非阻塞计数器
 * 引自原文：
 *      如果CAS失败，那么该操作将立即重试。通常，反复地重试是一种合理的策略，但在一些竞争
 * 很激烈的情况下，更好的方式是在重试之前首先等待一段时间或者回退，从而避免造成活锁问题。
 *      如果在CAS失败时不执行任何操作，那么是一种明智的做法。在非阻塞算法中，例如15.4.2节
 * 中的链表队列算法，当CAS失败时，意味着其他线程已经完成了你想要执行的操作。
 * create by yifeng
 */
public class CASCounter {
    private SimulatedCAS value;

    public int getValue() {
        return value.get();
    }

    public int increment() {
        int v;
        do {
            v = value.get();
        // 如果CAS失败，那么该操作将立即重试。
        } while (v != value.compareAndSwap(v, v+ 1));
        return v + 1;
    }
}
